package com.atguigu.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.atguigu.utils.JwtHelper;
import com.atguigu.utils.MD5Util;
import com.atguigu.utils.Result;
import com.atguigu.utils.ResultCodeEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.pojo.User;
import com.atguigu.service.UserService;
import com.atguigu.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
* @author 86135
* @description 针对表【news_user】的数据库操作Service实现
* @createDate 2024-01-07 19:23:59
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private JwtHelper jwtHelper;

    /*
    * 登录业务
    *   1 根据账户，查询对象 -loginUser
    *   2 如果用户对象为null 查询失败 账号错误 ！ 501
    *   3 对比 密码 失败 返回503的错误
    *   4 根据用户id生成一个token token -> result返回
    * */
    @Override
    public Result login(User user) {

        //根据账号查询数据库
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getUsername,user.getUsername());
        User loginUser = userMapper.selectOne(lambdaQueryWrapper);

        if (loginUser == null){
            return Result.build(null, ResultCodeEnum.USERNAME_ERROR);//账号错误返回501
        }

        //对比密码
        if (!StringUtils.isEmpty(user.getUserPwd()) &&
                MD5Util.encrypt(user.getUserPwd()).equals(loginUser.getUserPwd())){

            //登录成功 根据id生成token 将token封装到result返回
            String token = jwtHelper.createToken(Long.valueOf(loginUser.getUid()));
            Map data = new HashMap();
            data.put("token",token);
            return Result.ok(data);
        }

        //密码错误
        return Result.build(null,ResultCodeEnum.PASSWORD_ERROR);//密码错误返回503
    }

    @Override
    public Result getUserInfo(String token) {
        //是否过期 true是过期了
        boolean expiration = jwtHelper.isExpiration(token);
        if (expiration) {
            //失效未登录
            return Result.build(null,ResultCodeEnum.NOTLOGIN);
        }

        int userId = jwtHelper.getUserId(token).intValue();

        User user = userMapper.selectById(userId);
        user.setUserPwd("");

        Map data = new HashMap();
        data.put("loginUser",user);

        return Result.ok(data);
    }

    /*
     *   检查账号是否 可用
     *  根据账号进行count查询
     *  count == 0 可用
     *  count > 0 不可用
     * */
    @Override
    public Result checkUserName(String username) {

        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getUsername,username);
        Long count = userMapper.selectCount(lambdaQueryWrapper);
        if (count == 0) {
            return Result.ok(null);
        }

        return Result.build(null,ResultCodeEnum.USERNAME_USED);//用户账号已经被占用了
    }

    /*
     * 注册业务
     *  检查账户是否被注册
     *  密码加密处理
     *  账号数据保存
     *  返回结果
     * */
    @Override
    public Result regist(User user) {

        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getUsername,user.getUsername());
        Long count = userMapper.selectCount(lambdaQueryWrapper);
        if (count > 0) { //代表用户账号数据已经存在
            return Result.build(null,ResultCodeEnum.USERNAME_USED);
        }

        user.setUserPwd(MD5Util.encrypt(user.getUserPwd()));

        userMapper.insert(user);

        return Result.ok(null);
    }


}




